package com.huaxin.hxmodulesystem.models;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.huaxin.hxmodulesystem.common.MapToJsonTypeHandler;
import com.huaxin.hxmodulesystem.models.enums.BizType;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;

import java.time.LocalDateTime;
import java.util.Map;

/**
 * 短信发送任务实体类
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName(value = "sms_send_task", autoResultMap = true)
public class SmsSendTask extends BaseModel {
    /**
     * 业务ID
     */
    @TableField("biz_id")
    private String bizId;

    /**
     * 业务类型
     */
    @TableField("biz_type")
    private BizType bizType;

    /**
     * 手机号码
     */
    @TableField("phone")
    private String phone;

    /**
     * 短信模板编码（JSON格式）
     */
    @TableField("template_code")
    private String templateCode;

    /**
     * 短信模板参数
     */
    @TableField(value = "template_params", typeHandler = MapToJsonTypeHandler.class)
    private Map<String, Object> templateParams;

    /**
     * 发送状态
     */
    @TableField("send_status")
    private SendStatus sendStatus;

    /**
     * 重试次数
     */
    @TableField("retry_count")
    private Integer retryCount;

    /**
     * 最大重试次数
     */
    @TableField("max_retry")
    private Integer maxRetry = 3;

    /**
     * 下次重试时间
     */
    @TableField("next_retry_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime nextRetryTime = LocalDateTime.now();

    /**
     * 失败原因
     */
    @TableField("fail_reason")
    private String failReason;

    // 注意：
    // orgId, created_at, updated_at, is_deleted, deleted_at, deleted_by 等字段已继承自 BaseModel

    /**
     * 短信任务状态枚举
     */
    @Getter
    public enum SendStatus {
        PENDING(0, "待发送"),
        SENDING(1, "发送中"),
        SUCCESS(2, "发送成功"),
        FAILED(3, "发送失败");

        @EnumValue  // 👈 标记这个字段是数据库存储的值
        private final int value;

        private final String desc;

        SendStatus(int value, String desc) {
            this.value = value;
            this.desc = desc;
        }

        // 可选：根据 value 查找枚举（用于业务判断）
        public static SendStatus of(int value) {
            for (SendStatus status : values()) {
                if (status.value == value) {
                    return status;
                }
            }
            throw new IllegalArgumentException("Invalid SendStatus value: " + value);
        }
    }
}